Also some cleanups.
Signed-off-by: Xin Li <xin.b.li@intel.com>
{
struct hvm_domain *platform;
- if (!(HVM_DOMAIN(current) && (current->vcpu_id == 0)))
+ if ( !HVM_DOMAIN(current) || (current->vcpu_id != 0) )
return;
+ shadow_direct_map_init(d);
+
hvm_map_io_shared_page(d);
hvm_get_info(d);
pic_init(&platform->vpic, pic_irq_request, &platform->interrupt_request);
register_pic_io_hook();
- if ( hvm_apic_support(d) ) {
+ if ( hvm_apic_support(d) )
+ {
spin_lock_init(&d->arch.hvm_domain.round_robin_lock);
hvm_vioapic_init(d);
}
free_host_save_area(v->arch.hvm_svm.host_save_area);
#endif
- if (v->vcpu_id == 0) {
+ if ( v->vcpu_id == 0 )
+ {
/* unmap IO shared page */
struct domain *d = v->domain;
- if (d->arch.hvm_domain.shared_page_va)
+ if ( d->arch.hvm_domain.shared_page_va )
unmap_domain_page((void *)d->arch.hvm_domain.shared_page_va);
- shadow_direct_map_clean(v);
+ shadow_direct_map_clean(d);
}
destroy_vmcb(&v->arch.hvm_svm);
printk("%s: phys_table = %lx\n", __func__, pt);
}
- shadow_direct_map_init(v);
-
if ( svm_paging_enabled(v) )
vmcb->cr3 = pagetable_get_paddr(v->arch.guest_table);
else
error |= __vmwrite(GUEST_TR_BASE, 0);
error |= __vmwrite(GUEST_TR_LIMIT, 0xff);
- shadow_direct_map_init(v);
__vmwrite(GUEST_CR3, pagetable_get_paddr(v->domain->arch.phys_table));
__vmwrite(HOST_CR3, pagetable_get_paddr(v->arch.monitor_table));
void vmx_relinquish_resources(struct vcpu *v)
{
struct hvm_virpit *vpit;
-
+
if (v->vcpu_id == 0) {
/* unmap IO shared page */
struct domain *d = v->domain;
if ( d->arch.hvm_domain.shared_page_va )
unmap_domain_page_global(
(void *)d->arch.hvm_domain.shared_page_va);
- shadow_direct_map_clean(v);
+ shadow_direct_map_clean(d);
}
vmx_request_clear_vmcs(v);
__direct_get_l3e(v, vpa, &sl3e);
- if ( !(l3e_get_flags(sl3e) & _PAGE_PRESENT) )
+ if ( !(l3e_get_flags(sl3e) & _PAGE_PRESENT) )
{
page = alloc_domheap_page(NULL);
if ( !page )
- goto nomem;
+ goto nomem;
smfn = page_to_mfn(page);
sl3e = l3e_from_pfn(smfn, _PAGE_PRESENT);
__direct_get_l2e(v, vpa, &sl2e);
- if ( !(l2e_get_flags(sl2e) & _PAGE_PRESENT) )
+ if ( !(l2e_get_flags(sl2e) & _PAGE_PRESENT) )
{
page = alloc_domheap_page(NULL);
if ( !page )
- goto nomem;
+ goto nomem;
smfn = page_to_mfn(page);
sl2e = l2e_from_pfn(smfn, __PAGE_HYPERVISOR | _PAGE_USER);
__direct_get_l1e(v, vpa, &sl1e);
- if ( !(l1e_get_flags(sl1e) & _PAGE_PRESENT) )
+ if ( !(l1e_get_flags(sl1e) & _PAGE_PRESENT) )
{
sl1e = l1e_from_pfn(mfn, __PAGE_HYPERVISOR | _PAGE_USER);
__direct_set_l1e(v, vpa, &sl1e);
- }
+ }
shadow_unlock(d);
return EXCRET_fault_fixed;
return 0;
nomem:
- shadow_direct_map_clean(v);
+ shadow_direct_map_clean(d);
domain_crash_synchronous();
}
#endif
}
shadow_lock(d);
-
+
__direct_get_l2e(v, vpa, &sl2e);
if ( !(l2e_get_flags(sl2e) & _PAGE_PRESENT) )
sple = (l1_pgentry_t *)map_domain_page(smfn);
memset(sple, 0, PAGE_SIZE);
__direct_set_l2e(v, vpa, sl2e);
- }
+ }
if ( !sple )
sple = (l1_pgentry_t *)map_domain_page(l2e_get_pfn(sl2e));
return 0;
nomem:
- shadow_direct_map_clean(v);
+ shadow_direct_map_clean(d);
domain_crash_synchronous();
}
-int shadow_direct_map_init(struct vcpu *v)
+int shadow_direct_map_init(struct domain *d)
{
struct page_info *page;
l2_pgentry_t *root;
if ( !(page = alloc_domheap_page(NULL)) )
- goto fail;
+ return 0;
root = map_domain_page(page_to_mfn(page));
memset(root, 0, PAGE_SIZE);
unmap_domain_page(root);
- v->domain->arch.phys_table = mk_pagetable(page_to_maddr(page));
+ d->arch.phys_table = mk_pagetable(page_to_maddr(page));
return 1;
-
-fail:
- return 0;
}
-void shadow_direct_map_clean(struct vcpu *v)
+void shadow_direct_map_clean(struct domain *d)
{
int i;
unsigned long mfn;
- struct domain *d = v->domain;
l2_pgentry_t *l2e;
mfn = pagetable_get_pfn(d->arch.phys_table);
if(!new_modes) /* Nothing to do - return success */
return 0;
-
+
// can't take anything away by calling this function.
ASSERT(!(d->arch.shadow_mode & ~mode));
#define SHADOW_MAX_GUEST32(_encoded) ((L1_PAGETABLE_ENTRIES_32 - 1) - ((_encoded) >> 16))
-int shadow_direct_map_init(struct vcpu *v)
+int shadow_direct_map_init(struct domain *d)
{
struct page_info *page;
l3_pgentry_t *root;
if ( !(page = alloc_domheap_pages(NULL, 0, ALLOC_DOM_DMA)) )
- goto fail;
+ return 0;
root = map_domain_page(page_to_mfn(page));
memset(root, 0, PAGE_SIZE);
root[PAE_SHADOW_SELF_ENTRY] = l3e_from_page(page, __PAGE_HYPERVISOR);
- v->domain->arch.phys_table = mk_pagetable(page_to_maddr(page));
+ d->arch.phys_table = mk_pagetable(page_to_maddr(page));
unmap_domain_page(root);
return 1;
-
-fail:
- return 0;
}
-void shadow_direct_map_clean(struct vcpu *v)
+void shadow_direct_map_clean(struct domain *d)
{
unsigned long mfn;
- struct domain *d = v->domain;
l2_pgentry_t *l2e;
l3_pgentry_t *l3e;
int i, j;
#define SHADOW_ENCODE_MIN_MAX(_min, _max) ((((GUEST_L1_PAGETABLE_ENTRIES - 1) - (_max)) << 16) | (_min))
#define SHADOW_MIN(_encoded) ((_encoded) & ((1u<<16) - 1))
#define SHADOW_MAX(_encoded) ((GUEST_L1_PAGETABLE_ENTRIES - 1) - ((_encoded) >> 16))
-extern void shadow_direct_map_clean(struct vcpu *v);
-extern int shadow_direct_map_init(struct vcpu *v);
+extern void shadow_direct_map_clean(struct domain *d);
+extern int shadow_direct_map_init(struct domain *d);
extern int shadow_direct_map_fault(
unsigned long vpa, struct cpu_user_regs *regs);
extern void shadow_mode_init(void);